﻿using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.Collections.Generic;

/// <summary>
/// 单位控制类
/// </summary>
public class DepartmentComponent
{
	#region 属性
	public DepartmentDB clsData = new DepartmentDB();

	#endregion

	#region 构造函数
	public DepartmentComponent()
	{

	}
	#endregion

	#region 实体数据库间转换
	/// <summary>
	/// 把数据库中记录映射到实体对象
	/// </summary>
	/**********************************************************************************************
	 ** 功能描述：	把数据库中记录映射到实体对象
	 ** 输入参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-08-19
	 ** 修改：
	 ** 日期：
	 *********************************************************************************************/
	private Department DatabaseToEntity(DataRow dr)
	{
		Department clsDepartment = new Department();
		DataRow dr1;

		if (dr != null)
		{
			clsDepartment.ID = Convert.ToInt32(dr["Department_ID"]);
			clsDepartment.Name = dr["Department_Name"].ToString();
			clsDepartment.FatherID = Convert.ToInt32(dr["Department_FatherID"]);
			clsDepartment.Grade = Convert.ToInt32(dr["Department_Grade"]);
			clsDepartment.Status = Convert.ToInt32(dr["Department_Status"]);

			dr1 = clsData.QueryOneToDataRow(clsDepartment.FatherID);
			if (dr1 != null)
			{
				clsDepartment.Father = dr1["Department_Name"].ToString();
			}

			return clsDepartment;
		}
		else
		{
			return null;
		}
	}

	/// <summary>
	/// 把实体对象映射到数据库
	/// </summary>
	/**********************************************************************************************
	 ** 功能描述：	把实体对象映射到数据库
	 ** 输入参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-08-19
	 ** 修改：
	 ** 日期：
	 *********************************************************************************************/
	private void EntityToDatabase(Department clsDepartment)
	{
		clsData.arrTableColumnValue[0] = clsDepartment.ID.ToString();
		clsData.arrTableColumnValue[1] = clsDepartment.Name;
		clsData.arrTableColumnValue[2] = clsDepartment.FatherID.ToString();
		clsData.arrTableColumnValue[3] = clsDepartment.Grade.ToString();
		clsData.arrTableColumnValue[4] = clsDepartment.Status.ToString();
	}
	#endregion

	#region 添加、修改、删除
	public Boolean Add(Department clsAddDepartment)
	{
		Department clsFather = new Department();
		clsFather = GetOne(clsAddDepartment.FatherID);
		if (clsFather != null)
		{
			clsAddDepartment.Grade = clsFather.Grade + 1;
		}
		else
		{
			clsAddDepartment.Grade = clsData.clsConfig.nFirstDepartment;
		}
		EntityToDatabase(clsAddDepartment);
		return clsData.Add();
	}
	public Boolean Modify(Department clsModifyDepartment)
	{
		Department clsFather = new Department();
		clsFather = GetOne(clsModifyDepartment.FatherID);
		if (clsFather != null)
		{
			clsModifyDepartment.Grade = clsFather.Grade + 1;
		}
		else
		{
			clsModifyDepartment.Grade = clsData.clsConfig.nFirstDepartment;
		}
		EntityToDatabase(clsModifyDepartment);
		return clsData.Modify();
	}
	public Boolean Delete(Department clsDeleteDepartment)
	{
		EntityToDatabase(clsDeleteDepartment);
		return clsData.Delete();
	}
	#endregion

	#region 查询

	#region 根据ID获得一个单位实体对象
	/// <summary>
	/// 根据ID获得一个单位实体对象
	/// </summary>
	/**********************************************************************************************
	 ** 功能描述：	根据ID获得一个单位实体对象
	 ** 输入参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-08-19
	 ** 修改：
	 ** 日期：
	 *********************************************************************************************/
	public Department GetOne(int nID)
	{
		return DatabaseToEntity(clsData.QueryOneToDataRow(nID));
	}
	#endregion

	#region 查询所有单位，并根据等级排序，显示一级单位，如果该一级单位下有二级单位则马上显示二级单位，同理下级
	/// <summary>
	/// 查询所有单位，并根据等级排序，显示一级单位，如果该一级单位下有二级单位则马上显示二级单位，同理下级
	/// </summary>
	/**********************************************************************************************
	 ** 功能描述：	查询所有单位，并根据等级排序，显示一级单位，如果该一级单位下有二级单位则马上显示二级单位，同理下级
	 ** 输入参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-08-19
	 ** 修改：
	 ** 日期：
	 *********************************************************************************************/
	public List<Department> QueryAll()
	{
		List<Department> listAllDepartments = new List<Department>();
		DataTable dtFirstDepartments;
		Department clsDepartment;

		dtFirstDepartments = clsData.QueryDepartments(clsData.clsConfig.nNoFatherDepartment);

		foreach (DataRow dr in dtFirstDepartments.Rows)
		{
			clsDepartment = DatabaseToEntity(dr);
			listAllDepartments.Add(clsDepartment);
			QueryDepartments(clsDepartment, listAllDepartments);
		}

		return listAllDepartments;
	}
	#endregion

	#region 根据上级单位查询所属单位，并把所属单位添加到总的单位链表中
	/// <summary>
	/// 根据上级单位查询所属单位，并把所属单位添加到总的单位链表中
	/// </summary>
	/**********************************************************************************************
	 ** 功能描述：	根据上级单位查询所属单位，并把所属单位添加到总的单位链表中
	 ** 输入参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-08-19
	 ** 修改：
	 ** 日期：
	 *********************************************************************************************/
	private void QueryDepartments(Department clsFatherDepartment, List<Department> listAllDepartments)
	{
		DataTable dt;
		Department clsDepartment;
		string strTemp;				// 二级单位及下级单位前的缩进符号

		strTemp = "-";
		dt = clsData.QueryDepartments(clsFatherDepartment.ID);
		foreach (DataRow dr in dt.Rows)
		{
			clsDepartment = DatabaseToEntity(dr);
			strTemp = "-";
			for (int i = 0; i < clsDepartment.Grade; i++)
			{
				strTemp = strTemp + strTemp;
			}
			clsDepartment.Name = "|" + strTemp + clsDepartment.Name;
			listAllDepartments.Add(clsDepartment);
			QueryDepartments(clsDepartment, listAllDepartments);
		}
	}
	#endregion

	#region 根据单位名称、单位的上级单位ID查询单位，及其下属单位
	/// <summary>
	/// 根据单位名称、单位的上级单位ID查询单位，及其下属单位
	/// </summary>
	/**********************************************************************************************
	 ** 功能描述：	根据单位名称、单位的上级单位ID查询单位，及其下属单位
	 ** 输入参数：
	 ** 返回值：
	 ** 作者：	Tony Mucor
	 ** 日期：	2013-08-21 14:37
	 ** 修改：
	 ** 日期：
	 *********************************************************************************************/
	public List<Department> QueryDepartments(string strName, int nFatherID)
	{
		DataTable dt;
		List<Department> listReturn = new List<Department>();
		Department clsDepartment;

		dt = clsData.QueryDepartments(strName, nFatherID);

		foreach (DataRow dr in dt.Rows)
		{
			clsDepartment = DatabaseToEntity(dr);
			listReturn.Add(clsDepartment);
			QueryDepartments(clsDepartment, listReturn);
		}

		return listReturn;
	}
	#endregion

	#region 查询全部单位，并包括没有上级单位一项
	/// <summary>
	/// 查询全部单位，并包括没有上级单位一项
	/// </summary>
	/*******************************************************************
	 * * 功    能：	查询全部单位，并包括没有上级单位一项
	 * * 参    数：
	 * * 返 回 值：
	 * * 作    者： Tony Mucor
	 * * 创建日期： 2013-8-27 14:35:06
	 * *******************************************************************/
	public List<Department> QueryAllWithNoFather(string strNoFatherName)
	{
		List<Department> list = new List<Department>();
		Department clsNoFather = new Department();

		clsNoFather.ID = clsData.clsConfig.nNoFatherDepartment;
		clsNoFather.Name = strNoFatherName;
		list = QueryAll();
		list.Insert(0, clsNoFather);

		return list;
	}
	#endregion

	#endregion
}
